package socket.test1Base;

import org.junit.Test;

import java.io.*;
import java.net.*;

/**
 * Created by majian8 on 2019/6/25.
 */
public class Test4Socket {

    /**
     * 创建socket (从socket读)
     */
    @Test
    public void test1(){
        Socket socket=null;
        try {
            //创建对象的时候会尝试连接这个地址
            socket=new Socket("www.baidu.com",80);
            //设置超时时间(单位 毫秒)(为了方式服务器，接受了连接，然后停止对话，但是没有主动关闭连接)
            socket.setSoTimeout(50000);
            InputStream in=socket.getInputStream();
            //BufferedInputStream bin=new BufferedInputStream(in);
            InputStreamReader reader=new InputStreamReader(in,"utf-8");
            BufferedReader br=new BufferedReader(reader);
            String line="";
            while((line=br.readLine()) !=null){
                System.out.println(line);
            }


        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 向socket 写
     */
    @Test
    public void test2(){
        try {
            //1,写
            Socket socket=new Socket("afstest.jd.com",8080);
            socket.setSoTimeout(15000);
            OutputStream os=socket.getOutputStream();
            Writer writer=new OutputStreamWriter(os,"utf-8");
            writer.write("abcdef\r\n");
            writer.flush();//刷新
            //2,写完后可以读
            InputStream in=socket.getInputStream();
            BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8"));
            String line="";
            while((line=reader.readLine()) !=null){
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * socket 是双向连接 有时候想单独的关闭输入，或者单独的关闭输出可以通过下面方法
     * (并不是真正的关闭socket)只是调整socket连接的流。关闭输入，再读取的话
     * 会返回 -1 （page 246）
     */
    @Test
    public void test3() throws IOException {
        Socket socket=new Socket("www.baidu.com",80);
        //只关闭输入
        socket.shutdownInput();
        //只关闭输出
        socket.shutdownOutput();
    }

    /**
     * 从本机哪个端口开始连接
     */
    @Test
    public void test4() throws IOException {
        //第四个参数 localPort表示从本机的哪个端口开始连接 0 表示随机选取一个 1024-65535 之间的一个端口使用
        Socket socket=new Socket("www.baid.com",80, InetAddress.getByName("router"),0);
    }

    /**
     * 上面 构造函数加参数的，都是构造的时候就尝试连接，
     * 无参数的构造方法，构造时不连接，通过connect 连接
     */
    @Test
    public void test5() throws Exception{
        Socket socket=new Socket();
        SocketAddress address=new InetSocketAddress("www.baid.com",80);
        socket.connect(address,2000);

        //返回所连接系统的socketAddress
        SocketAddress remotAddress=socket.getRemoteSocketAddress();
        SocketAddress localAddress=socket.getLocalSocketAddress();
    }


    /**
     * 使用代理
     */
    @Test
    public void test7() throws IOException {
        //代理服务器地址
        SocketAddress proxyAddress=new InetSocketAddress("www.daili.com",80);
        Proxy proxy=new Proxy(Proxy.Type.SOCKS,proxyAddress);
        Socket socket=new Socket(proxy);
        SocketAddress address=new InetSocketAddress("www.baid.com",80);
        socket.connect(address);
    }


    /**
     * sockt 连接状态
     */
    @Test
    public void test8() throws IOException {
        Socket socket=new Socket("www.baidu.com",80);
        //1,判断socket 关闭，如果关闭的话返回true，但是如果sokcet 从未打开过，这个方法会返回false;
        System.out.println(socket.isClosed());
        //2,isConnect指的是socket是否连接过一个远程主机，如果连接过的话这个socket会返回true
        //即使这个socket已经关闭了
        //3, 要检查一个socket 当前是否 打开要判断两个条件 isConnect() 为true,isClose()为false

    }


    /**
     * socket 选项
     */
    @Test
    public void test9() throws IOException {
        Socket socket=new Socket("www.baidu.com",80);
        socket.setSoTimeout(1000);
    }




    @Test
    public void test(){

    }


}
